package com.incross.itracker.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.util.Log;


public class BKFileManager {
	
	private final String TAG = "BKFileManager";
	
	public static final int TYPE_FILE = 10;
	public static final int TYPE_DIRECTORY = 11;
	
	
	/**
     * 디렉토리 생성 
     * @return dir
     */
	public File makeDirectory(String dir_path){
		File dir = new File(dir_path);
		if (!dir.exists()) {
			dir.mkdirs();
			BKLog.i(TAG , "!dir.exists");
		} else {
			BKLog.i(TAG , "dir.exists");
		}
		
		return dir;
	}
	
	/**
     * 파일 생성
     * @param dir
     * @return file 
     */
	public File makeFile(File dir , String file_path){
		File file = null;
		boolean isSuccess = false;
		if(dir.isDirectory()){
			file = new File(file_path);
			if(file != null && !file.exists()){
				Log.i( TAG , "!file.exists" );
				try {
					isSuccess = file.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				} finally{
					Log.i(TAG, "파일생성 여부 = " + isSuccess);
				}
			} else{
				Log.i( TAG , "file.exists" );
			}
		}
		return file;
	}
	
	public boolean saveToTextFile(String path, String fileName, String text) {
		if(path == null || path.equals("") || fileName == null || fileName.equals("") || text == null || text.equals("")) return false;
		FileOutputStream fos;
		
		File dir = new File(path);
		
		if(!dir.exists()) {
			Log.w(getClass().getName(), "directory is not exists. make directory.");
			dir.mkdirs();
		}
		
		// check neither directory or not.
		if(!dir.isDirectory()) {
			Log.e(getClass().getName(), "given path is not directory.");
			return false;
		}
		
		File saveFile = new File(path + fileName);
		if(saveFile.isFile() && saveFile.exists()) {
			saveFile.delete();
		}
		
		try{
			fos = new FileOutputStream(path + fileName);
			fos.write(text.toString().getBytes());
			fos.close();
		} catch(IOException e){
			e.printStackTrace();
			return false;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		
		BKLog.i("saveSuccess");
		return true;
	}
	
	public String readTextFileToString(String path) {
		FileInputStream fis;
		String result = null;
		
		int size = 0;
		File file = new File(path);
		try {
			fis = new FileInputStream(file);
			size = fis.available();
			byte[] buffer = new byte[size];
			fis.read(buffer);
			
			result = new String(buffer);
			
			fis.close();
		} catch(IOException e) {
			e.printStackTrace();
			BKLog.w("SavedFile not found..");
		}
		
		return result;
	}
	
	/**
     * (dir/file) 절대 경로 얻어오기
     * @param file
     * @return String
     */
	public String getAbsolutePath(File file){
		return "" + file.getAbsolutePath();
	}
	
	/**
     * (dir/file) 삭제 하기
     * @param file
     */
	public boolean deleteFile(File file){
		boolean result = false;
		if(file!=null && file.exists()){
			file.delete();
			result = true;
		}
		
		return result;
	}
	
	/**
     * 파일여부 체크 하기
     * @param file
     * @return
     */
	public boolean isFile(File file){
		boolean result = false;
		if(file!=null&&file.exists()&&file.isFile()){
			result=true;
		}
		
		return result;
	}
	
	/**
     * 디렉토리 여부 체크 하기
     * @param dir
     * @return
     */
	public boolean isDirectory(File dir){
		boolean result = false;
		if(dir!=null&&dir.isDirectory()){
			result=true;
		}
		
		return result;
	}
	
	/**
     * 파일 또는 디렉토리 존재여부 확인
     * @param file
     * @return
     */
	public boolean isExist(String path) {
		if(path == null || path.equals("")) return false;
		
		boolean result = false;
		File target = new File(path);
		
		if(target != null && target.exists()){
			result=true;
		}
		
		return result;
	}
	
	/**
     * 파일 이름 바꾸기
     * @param file
     */
	public boolean reNameFile(File file , File new_name) {
		boolean result = false;
		if(file!=null && file.exists() && file.renameTo(new_name)){
			result=true;
		}
		
		return result;
	}
	
	/**
     * 디렉토리에 안에 내용을 보여 준다.
     * @param file
     * @return
     */
	public String[] getList(File dir){
		if(dir!=null&&dir.exists())
			return dir.list();
		return null;
	}
	
	/**
     * 파일에 내용 쓰기
     * @param file
     * @param file_content
     * @return
     */
	public boolean writeFile(File file , byte[] file_content){
		boolean result = false;
		FileOutputStream fos;
		if(file != null && file.exists() && file_content != null) {
			try {
				fos = new FileOutputStream(file);
				try {
					fos.write(file_content);
					fos.flush();
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			result = true;
		}else{
			result = false;
		}
		return result;
	}
	
	/**
     * 파일 읽어 오기 
     * @param file
     */
	public String readFile(File file){
		String result = null;
		int readcount=0;
		if(file!=null&&file.exists()){
			try {
				FileInputStream fis = new FileInputStream(file);
				readcount = (int)file.length();
				byte[] buffer = new byte[readcount];
				fis.read(buffer);
				for(int i=0 ; i<file.length();i++){
					Log.d(TAG, ""+buffer[i]);
					result += buffer[i];
				}
				fis.close();
			} catch (Exception e) {
				e.printStackTrace();
				result = "";
			}
		}
		return result;
	}
	
	
	/**
     * copy files
     * @param file
     * @param save_file
     * @return
     */
	public boolean copyFile(File file , String save_file){
		boolean result;
		if(file!=null && file.exists()){
			try {
				FileInputStream fis = new FileInputStream(file);
				FileOutputStream newfos = new FileOutputStream(save_file);
				int readcount=0;
				byte[] buffer = new byte[1024];
				while((readcount = fis.read(buffer,0,1024))!= -1){
					newfos.write(buffer,0,readcount);
				}
				newfos.close();
				fis.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			result = true;
		}else{
			result = false;
		}
		return result;
	}

}

